/**
 * vue源码之判断对象浅相等
 */
function looseEqual(a, b) {
  // 如果两个对象的地址相同，则相等
  if (a === b) {
    return true;
  }
  // 判断参数a和b是否是对象
  const isObjectA = isObject(a);
  const isObjectB = isObject(b);
  // 如果两个都是对象，则进行深度比较
  if (isObjectA && isObjectB) {
    try {
      // 判断a和b是否是数组
      const isArrayA = Array.isArray(a);
      const isArrayB = Array.isArray(b);
      // 如果都是数组，则进行深度比较
      if (isArrayA && isArrayB) {
        return a.length === b.length && a.every((e, i) => looseEqual(e, b[i]));
      } else if (!isArrayA && !isArrayB) {
        // 如果都是对象，则进行深度比较
        const keysA = Object.keys(a);
        const keysB = Object.keys(b);
        return (
          keysA.length === keysB.length &&
          keysA.every((key) => looseEqual(a[key], b[key]))
        );
      } else {
        // 如果a(b)是数组，b(a)不是，则返回false
        return false;
      }
    } catch (e) {
      return false;
    }
  }else if(!isObjectA && !isObjectB){
    // 如果都不是对象，转换成String后进行比较
    return String(a) === String(b);
  }else{
    // 如果a(b)是对象，b(a)不是，则返回false
    return false;
  }
}

// 判断是不是对象（Object、Array）
function isObject(obj) {
  return obj !== null && typeof obj === "object";
}
// 判断是不是引用类型 （Object、Array、Function）
function isRef(obj) {
  return obj !== null && (typeof obj === "object" || typeof obj === "function");
}
// 获取数据类型
function getType(value) {
  /**
   * 返回的都是字符串
   * "Object"、"Array"、"Function"、
   * "String"、"Number"、"Boolean"、"Null"、"Undefined"
   * "RegExp"、"Date"
   */
  return Object.prototype.toString.call(value).slice(8, -1);
}
